昨天建立floating IP後,想要透過網際網路(實際上是由network-controller node的10.0.2.0/24網段)存取floating ip前,我們必需先設定security group允許外部的存取。如果沒有特別設定,VM建立完成後,會採用default 的security group,這預設的行為是:
然而,實際上封包能不能進出VM, 都是透過ovs上的規則去控制。今天我們就來看看Security Group與OVN之間的關係吧。
今天的架構系昨天是完全相同,只是今天我們在圖中,特別將OpenStack的Security Group呈現出來。
# create sg for icmp
openstack security group create allow-icmp
openstack security group rule create --protocol icmp --remote-ip 0.0.0.0/0 allow-icmp
# add sg to instances
openstack server add security group vm_1 allow-icmp
2.查看OpenStack上的資訊,確實與圖中預期要建立的長像是相同.
openstack server show vm_1 --format table -c security_groups -c name
+-----------------+-------------------+
| Field | Value |
+-----------------+-------------------+
| name | vm_1 |
| security_groups | name='allow-icmp' |
| | name='default' |
+-----------------+-------------------+
openstack security group rule list -c ID -c 'IP Protocol' -c Ethertype -c 'IP Range' -c 'Direction' -c 'Remote Security Group' -c 'Security Group' | grep da83 | abbrev
+--------+-------------+-----------+-----------+-----------+------------------------+------------------+
| ID | IP Protocol | Ethertype | IP Range | Direction | Remote Security Group | Security Group |
+--------+-------------+-----------+-----------+-----------+------------------------+------------------+
| 29ee2e | icmp | IPv4 | 0.0.0.0/0 | ingress | None | da83cb |
| be5117 | None | IPv4 | 0.0.0.0/0 | egress | None | da83cb |
| fdbb51 | None | IPv6 | ::/0 | egress | None | da83cb |
+--------+-------------+-----------+-----------+-----------+------------------------+------------------+
Remote Security Group
,而不是IP range, 使得在同一個Project裡的instance可以通訊。openstack security group rule list -c ID -c 'IP Protocol' -c Ethertype -c 'IP Range' -c 'Direction' -c 'Remote Security Group' -c 'Security Group' | grep f88 | abbrev
+--------+-------------+-----------+-----------+-----------+-----------------------+------------------+
| ID | IP Protocol | Ethertype | IP Range | Direction | Remote Security Group | Security Group |
+--------+-------------+-----------+-----------+-----------+-----------------------+------------------+
| 095bf1 | None | IPv6 | ::/0 | ingress | f88835 | f88835 |
| 6be621 | None | IPv4 | 0.0.0.0/0 | ingress | f88835 | f88835 |
| 6c7c10 | None | IPv6 | ::/0 | egress | None | f88835 |
| a459fd | None | IPv4 | 0.0.0.0/0 | egress | None | f88835 |
+--------+-------------+-----------+-----------+-----------+-----------------------+------------------+
我們再來看看建立security group時,在OVN上會產生那些東西吧。OpenStack的Security Group 對應到OVN 上的Port Group;Security Group Rule會對應到 OVN 上的ACL。
可以用ovn-nbctl將OVN上所有的port group 列出來,在port-group裡,有一個ports
的欄位,這個欄位表示這個port group被套用在那一個logical switch port上。以我們的圖為例,vm_1是接用名稱為0bece6
的logical switch port上,而這個port的id是5c765c
. 所以,可以發覺,目前共有三個port-group被套用在 5c765c
上。而每一個port-group設定那些acl,則是顯示在acls
欄位里。
ovn-nbctl list port-group | abbrev
# drop all packate
_uuid : 2db2f0
acls : [d4acd4, febd6a]
external_ids : {}
name : neutron_pg_drop
ports : [5c765c]
# mapping to allow-icmp
_uuid : efaedc
acls : [6504e8, 77e573, a0349f]
external_ids : {"neutron:security_group_id"="da83cb"}
name : pg_da83cb
ports : [5c765c]
# mapping to default
_uuid : ad1dfc
acls : [4e65fd, 5d74c3, 63d69a, 80ca87]
external_ids : {"neutron:security_group_id"="f88835"}
name : pg_f88835
ports : [5c765c]
我們這裡以pg_da83cb
port group為例,把pg_da83cb
所用的acl列出來,ACL的數量和security group 裡的rule數量是相同的,再仔細一看,也可以發現ACL的條件(match
)、ingress/egress、action,都和security group rule是對應的喔。
ovn-nbctl --format table --columns _uuid,action,direction,match list acl | abbrev |grep pg_da83cb
_uuid action direction match
------ ------------- ---------- -----------------------
77e573 allow-related to-lport "outport == @pg_da83cb && ip4 && ip4.src == 0.0.0.0/0 && icmp4"
a0349f allow-related from-lport "inport == @pg_da83cb && ip4"
6504e8 allow-related from-lport "inport == @pg_da83cb && ip6"
但是和OpenStack相比,有一點比較特殊,對於每個logical switch port,OVN都會有一個neutron_pg_drop
的port group,用途是deny any ,所以在沒有任何的 allow 規則的port group的話,VM是都無法上網的。
在ovn-nbctl上查到的port group 與 acl等資訊,必需在South bound DB上的logical flow也有相對應的設定,logical switch會依照這些flow 規則決定封包的走向。從SB檢查logical flow
ovn-sbctl lflow-list n1 | abbrev | grep -Ev hint |grep -E 'ls_out_acl|ls_in_acl' |grep @pg
pg)f88835
)有關。pg_da83cb
出現在logical flow上。